<?php


/**
 * Notes:
 * PROJECT_NAME : ERP v1.8 重构erp
 * User: 夏鱼儿<397072174@qq.com>
 * Date: 2024/7/3
 * Time: 20:03
 */

namespace app\tms\job;

use app\service\traits\model\Sms;
use app\tms\model\DeliverTask;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Log;
use think\queue\Job;

class TaskSms
{
    use Sms;

    /**
     * fire是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array $data 发布任务时自定义的数据
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public function fire(Job $job, array $data): void
    {
        Log::error('任务超时发送短信1:'.json_encode($data));
        //有效消息到达消费者时可能已经不再需要执行了
        if (!$this->checkJob($data)) {
            $job->delete();
            return;
        }
        //执行业务处理
        if ($this->doJob($data)) {
            $job->delete();//任务执行成功后删除
        } else {
            Log::error('任务超时发送短信2:'.json_encode($data));
            //检查任务重试次数
            if ($job->attempts() > 3) {
                Log::error('任务超时发送短信:执行失败:任务数据：' . json_encode($data));
                //todo  有空写入表中,后台可以展示处理
                $job->delete();
            }
        }
    }

    /**
     * 消息在到达消费者时可能已经不需要执行了
     * @param array $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    private function checkJob(array $data): bool
    {
        if (!isset($data['task_ids'])) return false;
        if (!isset($data['mobile'])) return false;
        $order = DeliverTask::whereIn('id', $data['task_ids'])->where('task_status','<>',3)->select();
        if ($order->isEmpty()) return false;//订单不存在
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     */
    private function doJob(array $data): bool
    {
        try {
            //todo 短信模版有问题,上线前需要更换掉
            $code = 888888;
            //发送短信
            if (!$this->send($data['mobile'], "login", $code)) {
                return false;
            }
        }catch (Exception $e){
            return false;
        }
        return true;
    }
}